// 使用 Json

#include <iostream>
#include <jsoncpp/json/json.h>
#include <memory>
#include <string>

int main()
{

    // 序列化 :

    /*1. 将需要序列化的数据存储在 Json::Value 中*/
    Json::Value root;
    root["name"] = "zhangsan";
    root["age"] = 20;
    root["gender"] = "man";
    root["school"] = "shanxi";
    /*2. 实例化一个 SteamWriterBuild 工厂类对象*/
    Json::StreamWriterBuilder swb;
    /*3. 用SteamWriterBuild 工厂类对象生产一个SteamWriter对象*/
    std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
    std::stringstream ss;
    int ret = sw->write(root, &ss);
    if (ret != 0)
    {
        std::cout << "Serialize failed!\n";
        return -1;
    }

    //输出序列化结果
    std::cout << "Json String : " << ss.str() << std::endl;

    std::string st = ss.str();

    //反序列化 : 

    /*1. 创建CharReaderBuilder 工厂类对象*/
    Json::CharReaderBuilder crb;
    /*2. 用 CharReaderBuilder 工厂类对象生产一个 CharReader 对象*/
    std::unique_ptr<Json::CharReader> cr(crb.newCharReader());
    /*3. 创建 Json::Value 对象保存反序列化结果*/
    Json::Value root1;
    /*4. 用 CharReader 对象对数据反序列化*/
    cr->parse(st.c_str(),st.c_str()+st.size(),&root1,nullptr);
    /*5. 访问每一个数据*/
    std::cout << "rjson result : \n" 
              << "name" << root["name"].asString() << "\t"
              << "age" << root["age"].asInt() << "\t"
              << "gender" << root["gender"].asString() << "\t"
              << "school" << root["school"].asString();

    return 0;
}